NLP

Mem2Seq Effectively Incorporating Knowledge Bases into End-to-End Task-Oriented Dialog Systems

本文提出了一个端到端的基于memory network和指针网络的对话生成模型,结合多跳注意力机制和指针网络,从对话历史和词汇表中生成回复。ACL2018
paper link
code link

Introduction

传统的任务型对话系统在建模模型内部各模块的依赖性上复杂度较高,在嵌入知识库上需要人为标注。较为流行的是end-to-end任务型对话系统,它使用RNN作为encoder-decoder模块,并且添加注意力机制以及cpoy-net的方法。但由于RNN自带的弊端–在长序列中表现不稳定以及时间计算开销大(尤其加入注意力机制后)。另一种方法是端到端的记忆网络(MemNN),它将外部存储器嵌入若干个embedding 矩阵,并使用查询向量反复的读取存储器,即能够记忆外部知识库信息并且快速编码长对话历史记录。但是,MemNN只是从预定义的候选池中选择输出响应,而不是逐字生成,并且Memory query需要显示设计而不是被学习,也缺乏从原文复制的能力。

原文提出的Mem2Seq模型在原有的MemNN框架下,使用序列生成结构扩充MemNN,利用全局多跳注意力直接从知识库或者对话历史中copy词。原文的创新点:

  • Mem2Seq是第一个使用带有指针网络思想的多跳注意力机制的模型,这种方法有效的结合了KB的信息。
  • Mem2Seq学习如何生成动态的查询来控制memory的访问

Model

Figure  1:  The  proposed  Mem2Seq  architecture  for  task-oriented  dialog  systems.  (a)  Memory  encoder with  3  hops;  (b)  Memory  decoder  over  2  step  generation.

Memory Encoder

编码器是一个memory network,类似于End-To-End Memory Networks的结构:

Figure 1: End-To-End Memory Networks (a): A single layer version of our model. (b): A three layer version of our model. In practice, we can constrain several of the embedding matrices to be the same (see Section 2.2).

本文将所有的对话历史拼接成序列 $X=\{x_{1},x_{2},…,x_{n}\}$。本文使用的知识库如下:

为了在memory中存储KB信息,作者将(subject, relation, object)三元组对应的词向量相加:

For example, we represent the information of The Westin in Table 1: (The Westin, Distance, 5 miles).Thus, we sum word embeddings of the subject, relation, and object to obtain each KB memory representation.

During decoding stage, the object part is used as the generated word for $P_{ptr}$. For instance, when the KB tuple (The Westin, Distance, 5 miles) is pointed, our model copies “5 miles” as an output word. Notice that only a specific section of the KB, relevant to a specific dialog, is loaded into the memory.

因此,Encoder的输入定义为 $U=[B;X;\$]$,其中$B=\{b_{1},…,b_{l}\}$,代表KB中的三元组,\$是特殊的分隔符,决定decoder的输出是copy还是自然生成(见Memory Decoder部分)。Encoder的输入为U中的word-level的信息,定义可学习的embedding matrices集合$C=\{C^{1},C^{2},…,C^{K+1}\}$,其中的每个$C^{k}$表示U中的tokens到vectors的映射,是一个矩阵,$q^{k}$是查询向量。因此,第K层(K hop)的注意力计算如下:

其中$C_{i}^{k}=C^{k}(x_{i})$表示memory中第i个token对应的向量。

然后更新$q^{k+1}=q^{k}+o^{k}$,其中嵌入矩阵为了减少参数的复杂度,采用的是adjacent weighted tying方法,即相邻的嵌入矩阵相等,如下:

Memory Decoder

解码器的初始输入是 $o^{k}$ ,它是编码器的最后一层的输出。解码器使用一个GRU作为动态查询生成器,利用先前的生成词以及隐状态作为输入。0时刻的隐状态 $h_{0}=o^{k}$, t 时刻的隐状态计算公式为: $h_{t}=GRU(C^{1}(\widetilde{y}_{t-1}),h_{t-1})$ 。解码器的结构如图所示:

每一个时刻,将产生两个分布:词表分布 $P_{vocab}$ 和记忆分布 $P_{ptr}$ 。记忆分布是指对话历史以及KB的word distribution,来自于最后一跳的注意力分布;而词表分布来自于第一跳:

训练阶段,给定目标输出$Y=\{y_{1},…,y_{m}\}$,首先计算每个词的pointer index:

上式的含义为:对于给定的$y_{i}$如果出现在memory集合U中,则认为$y_{i}$是由memory中的词copy得到(对于memory可能出现多次$y_{i}$,默认取最后一个),如果没有出现在memory集合U中,则指向特殊结束符$。对于每一个词$y_{i}$,如果它的index指向$,则说明这个词是由$P_{vocab}$生成,损失函数为$y_{i}$ pointer index分布与$P_{ptr}$的交叉熵和$P_{vocab}$与实际的词分布的交叉熵之和;否则是由$P_{ptr}$生成,损失函数为$y_{i}$ pointer index分布与$P_{ptr}$的交叉熵。

测试阶段,得到两个分布:词表分布 $P_{vocab}$ 和记忆分布 $P_{ptr}$后,判断$P_{ptr}$中$的选择概率是否最大,如果选中$,则最终的词来源于 $P_{vocab}$;否则最终的词来源于记忆分布 $P_{ptr}$。

Basically, the sentinel token is used as a hard gate to control which distribution to use at each time step.

_在原始的pointer-generator networks论文中,从两种分布中选择一个词是通过一个门函数,类似于soft gate得到一个概率,然后用这个概率将两个分布加权求和得到最后的生成分布。_

Experiment

Dataset

原文在三个数据集上取得SOA的结果,数据集为:bAbI(模拟对话)、DSTC2(真实人机对话)、In-Car(人-人对话和多域对话)。三个数据集的统计特性如图4所示:

bAbI:Task1-4分别是API调用,优化API调用,推荐操作以及提供其他信息。Task5是Task1-4的集合。

对话状态追踪挑战2(DSTC2)忽略对话状态注释。本数据集与bAbI的主要区别在于:DSTC2从真实的人机对话中提取的,由于语音识别错误或误解导致机器人出错,引入较多噪声,任务更难。

车载助手数据集(In-Car Assistant dataset)是从Amazon Mechanical Turk收集的人—人多域对话数据集。 它有三个不同的域:日历安排,天气信息检索和兴趣点导航。 此数据集的会话转换时间较短,但用户和系统行为更加多样化。 此外,系统响应是多变的,知识库信息要复杂得多。 因此,此数据集相较于对话状态追踪,其实是需要更强的与知识库的交互能力。

Results

Table  3:  Per-response  and  per-dialog  (in  the  parentheses)  accuracy  on  bAbI  dialogs.  Mem2Seq  achieves the  highest  average  per-response  accuracy  and  has  the  least  out-of-vocabulary  performance  drop.

H1、H3、H6表示的是多跳的个数,即k值。具有6跳的Mem2Seq在T5中可实现每次响应97.9%和每个对话69.6%的准确度,在T5-OOV中达到84.5%和2.3%,这远远超过现有方法。此外,在任务3-5中证明了跳跃的有效性,因为multi-hop对知识库信息的具有推理能力。

Table  4:  Evaluation  on  DSTC2. Seq2Seq  (+attn  and  +copy)  is  reported from  Eric  and  Manning  (2017).

Mem2Seq拥有最高75.3%的Entity F1得分和55.3 BLEU得分。这进一步证实了Mem2Seq在使用多跳机制而不丢失语言建模的情况下可以很好地检索正确的实体。但是可以发现,每个模型的每个响应精度都小于50%,这是因为数据集非常嘈杂,所以很难生成与黄金响应完全相同的响应。

Table  5:  Evaluation  on  In-Car  Assistant.  Human,  rule-based  and  KV  Retrieval  Net  evaluation  (with  *)  are  reported
from  (Eric  et  al.,  2017),  which  are  not  directly  comparable. Mem2Seq  achieves  highest  BLEU  and  entity  F1  score  over baselines.

Mem2Seq在In-Car Assistant数据集可以达到最高12.6 BLEU分数。此外,Mem2Seq在Entity F1得分(33.4%)方面显示出有希望的结果,一般来说,远远高于其他基线。 值得注意的是,如Seq2Seq或Ptr-Unk这类在此数据集中的性能尤其差,因为RNN方法编码较长知识库信息的效率非常低,这是Mem2Seq的优势。有个有趣的现象,Human在Entity F1上取较高分,在BLEU上取较低分。这意味着对实体(跳跃)更强的推理能力至关重要,但结果可能与gold答案不相似。因为Human在表述输出的时候可以有多样的表达,但是不一定与gold答案匹配。

Conclusion

本文提出的Mem2Seq模型是在原有的MemNN框架(从候选集中选择回复)下,使用序列生成结构扩充MemNN,利用全局多跳注意力直接从知识库或者对话历史中copy词,核心点是使用带有指针网络思想的多跳注意力机制,这种方法有效的结合了KB的信息,其次是Mem2Seq学习如何生成动态的查询来控制memory的访问。